package example.testBeanFactoryPostProcessor;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class BeanfactoryPostProcessorMain {

	public static void main(String[] args) {
		//one();

		two();

	}

	private static void two() {
		AnnotationConfigApplicationContext context =
				new AnnotationConfigApplicationContext(BeanFactoryPostProcessorConfig.class);
		//由于这种方式会在AnnotationConfigApplicationContext构造方法中就会执行refresh方法，所以即使加上下面这句代码，也是不起作用的
		//context.addBeanFactoryPostProcessor(new MyBeanFactoryPostPRocessor());
		NeedChangeBean bean = context.getBean(NeedChangeBean.class);
		NeedChangeBean bean2 = context.getBean(NeedChangeBean.class);
		// 需要注意的是对于我们自己定义的MyBeanFactoryPostPRocessor（bean工厂的后置处理器也是需要交给spring来管理才会生效）
		System.out.println(bean.hashCode() + "----" + bean2.hashCode());
	}

	private static void one() {
		AnnotationConfigApplicationContext context =
				new AnnotationConfigApplicationContext();
		context.register(BeanFactoryPostProcessorConfig.class);
		//如果在MyBeanFactoryPostPRocessor这个类上面没有加@Component
		// 这个注解，那么可以通过这种方式使用，但是addBeanFactoryPostProcessor这个方法必须是在refresh方法执行之前执行
		context.addBeanFactoryPostProcessor(new MyBeanFactoryPostPRocessor());
		context.refresh();
		NeedChangeBean bean = context.getBean(NeedChangeBean.class);
		NeedChangeBean bean2 = context.getBean(NeedChangeBean.class);
		// 需要注意的是对于我们自己定义的MyBeanFactoryPostPRocessor（bean工厂的后置处理器也是需要交给spring来管理才会生效）
		System.out.println(bean.hashCode() + "----" + bean2.hashCode());
	}
}
